package pl.koziolekweb.musicarchchecker;

import java.io.File;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Prawidłowa nazwa katalogu z plikami powinna spełniać założenia ( {@link Checker#pattern} ):<br/>
 * <ul>
 * <li>pierwsze cztery znaki to data wydania</li>
 * <li>następnie spacja myślnik i spacja lub sama spacja</li>
 * <li>następnie nazwa płyty</li>
 * </ul>
 * Przykłady:
 * <ul>
 * <li><samp>2007 - Liberty Or Death</samp></li>
 * <li><samp>2007 Liberty Or Death</samp></li>
 * </ul>
 */
public class Checker implements CheckerInterface {

	private CheckerPrinter checkerPrinter = new CheckerPrinter();

	/**
	 * Wzorzec sprawdzający poprawność nazwy płyty<br/>
	 * <samp>"^\\d{4}(( - )|( )).*$"</samp>
	 */
	private Pattern pattern = Pattern.compile("^\\d{4}(( - )|( )).*$");

	/**
	 * Metoda sprawdza czy nazwa płyty pasuje do wzorca.
	 * 
	 * @param name
	 *            nazwa płyty
	 * @return prawda jeżeli pasuje do wzorca. Fałsz w przeciwnym wypadku
	 */
	public boolean check(String name) {
		Matcher matcher = pattern.matcher(name);
		return matcher.matches();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * pl.koziolekweb.musicarchchecker.CheckerInterface#checkLibrary(java.io
	 * .File)
	 */
	public void checkLibrary(File library) {
		for (File band : library.listFiles()) {
			checkBand(band);
		}
	}

	private void checkBand(File band) {
		if (isNotHiddenAndIsDirectory(band)) {
			for (File album : band.listFiles()) {
				checkAlbum(album);
			}
		}
	}

	private void checkAlbum(File album) {
		if (isNotHiddenAndIsDirectory(album)) {
			if (check(album.getName())) {
				checkerPrinter.print(album);
			}
		}
	}

	private boolean isNotHiddenAndIsDirectory(File entry) {
		return entry.isDirectory() && !entry.isHidden();
	}
}
